// hdu5730
// ml:run = $bin < 1008.in
// ml:opt = 0
// ml:ccf += -g
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>

using namespace std;
typedef long long ll;
int t, n;
ll const mo = 313;
const int N = 400005;
const double pi = acos(-1.0);
const int g=3;
//const int len=1<<18;
const long long MOD=50000000001507329LL;
int len;
char A[N],B[N];
long long a[N],b[N],qp[30];
long long fa[N],fb[N],tmp[N];
int ans[N];

void p(long long a[])
{
	for(int i=0;i<len;i++)printf("%lld ",a[i]);puts("");
}

long long mult(long long x,long long y,long long mod){
	long long tmp=(x*y-(long long)((long double)x/mod*y)*mod);
	return tmp<0 ? tmp+mod : tmp;
}

long long q_pow(long long x,long long y,long long P)
{
	long long ans=1;
	while(y>0)
	{
		if(y&1)ans=mult(ans,x,MOD);
		x=mult(x,x,MOD);
		y>>=1;
	}
	return ans;
}
void init()
{
	len=1;
	for(int i=0;i<21;i++) {
		int t=1<<i;
		qp[i]=q_pow(g,(MOD-1)/t,MOD);
	}
}
void rader(long long F[],int len)
{
	int j=len/2;
	for(int i=1;i<len-1;i++)
	{
		if(i<j)swap(F[i],F[j]);
		int k=len/2;
		while(j>=k)
		{
			j-=k;
			k>>=1;
		}
		if(j<k)j+=k;
	}
}
void NTT(long long F[],int len,int t)
{
	int id=0;
	rader(F,len);
	for(int h=2;h<=len;h<<=1)
	{
		id++;
		for(int j=0;j<len;j+=h)
		{
			long long E=1;
			for(int k=j;k<j+h/2;k++)
			{
				long long u=F[k];
				long long v=mult(E,F[k+h/2],MOD);
				F[k]=(u+v)%MOD;
				F[k+h/2]=((u-v)%MOD+MOD)%MOD;
				E=mult(E,qp[id],MOD);
			}
		}
	}
	//p(F);
	if(t==-1)
	{
		for(int i=1;i<len/2;i++)swap(F[i],F[len-i]);
		long long inv=q_pow(len,MOD-2,MOD);
		for(int i=0;i<len;i++)F[i]=mult(F[i]%MOD,inv,MOD);
	}
	//p(F);
}

template <class T>
void multiply(T a[], int n1, T b[], int n2, T res[], int & len)
{
    int n = 1;
    while (n < n1 || n < n2) n *= 2;
    n *= 2; len = n;
    for (int i = 0; i < n1; i++) fa[i] = a[i];
    for (int i = n1; i < n; i++) fa[i] = 0;
    for (int i = 0; i < n2; i++) fb[i] = b[i];
    for (int i = n2; i < n; i++) fb[i] = 0;

	NTT(fa, n,1);
	NTT(fb, n,1);
	for(int i=0;i<n;i++) fa[i]=mult(fa[i],fb[i],MOD);
	NTT(fa,n,-1);

    for (int i = 0; i < n; i++)
        res[i] = fa[i] % mo;

}

void calc(int l, int r)
{
    if (l == r) { ans[l] = (ans[l] + a[l]) % mo; return; }
    int mid = (l + r) / 2;
    calc(l, mid);
    for (int i = l; i <= mid; i++) b[i - l + 1] = ans[i] % mo;
    int len = r - l + 2;
    multiply(a, r - l + 1, b, mid - l + 2, tmp, len);

    for (int i = mid + 1; i <= r; i++) {
        ans[i] += tmp[i - l + 1];
        ans[i] %= mo;
    }
    calc(mid + 1, r);
}

int work()
{
    calc(1, n);
    /* for (int i = 0; i <= n; i++) std::cout << ans[i] << " "; std::cout << "\n"; */
    return ans[n] % mo;
}

int main()
{
    init();
    while (std::scanf("%d", &n) && n) {
        std::memset(ans, 0, sizeof(ans));
        for (int i=1;i<=n;i++){
            long long x; scanf("%lld", &x);
            a[i]=x % mo;
        }
        printf("%d\n", work());
	}
}

